مشخصات مقاله
-
1567
-
0.0
-
3266
-
0
-
0
آموزش عملگرها ، نوع ها و متغییرها
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد
عملگرها، نوع ها و متغیرها
این مبحث عملگرها،نوع ها و متغیرها را معرفی می کند و درصدد پاسخ گویی به نیازهای زیر می باشد.
متغیر چیست؟
آشنایی با نوع های توکار C#.
معارفه ای بر مبانی عملگرها.
آشنایی با نحوه ی به کارگیری آرایه ها.
متغیرها و نوع ها
متغیرها تنها مکانی برای ذخیره سازی اطلاعات می باشند. می توانید اطلاعات در آن قرار داده و محتوایات آن را به عنوان جزی از عبارات C# بازیابی کنید. تفسیر اطلاعات در متغیرها توسط نوع ها "Types". کنترل می شود.
C# زبان بسیار قوی ("Strongly Typed") است. بنابراین تمام عملیات صورت گرفته بر روی متغیرها با در نظر گرفتن نوع متغیر صورت می پذیرد. قوانینی وجود دارد که اعتبار و استاندارد عملیاتی که در متغیر صورت می پذیرد را تعیین می کند، مبادا تمامیت و انسجام اطلاعات وارد شده در متغیر دستخوش تغییر شده یا صدمه ببیند.
نوع های ساده ی C# از نوع Bolean و سه نوع عددی - Integrals، Floating Point ، Decimal-و همچنین رشته تشکیل شده اند. واژه ی "Integrals"، که در خصوصیات زبان برنامه نویسی C#نیز تعریف شده، به طبقه بندی نوع ها که شامل sbyte،byte ، short، ushort،int ، uint، long ، ulong و char می شود اشاره دارد.واژه ی "Floating Point" (عدد شناور) به نوع های دابل و شناور اشاره دارد. نوع رشته(ای) (string type) نیز به رشته ای از کاراکترها اشاره دارد.
نوع Boolean
نوع های bolean با کلیدواژه ی boo تعریف می شوند.دو مقدار true و false دارند. در زبان های دیگر از جمله C++، موقعیت Boolean به گونه ای هست که هر جا 0 داشتیم false و هرچیز دیگری true محسوب می شود.در حالی که در C# تنها دو مقدارکلید واژه true وfalse ، وضعیت Boolean را فراهم می آورند.Listing 1-2 تنها یکی از چند روشی که می توان نوع Boolean را در برنامه به کاربرد به نمایش می گذارد.
Listing 1-2 :: نشان دادن مقدارهای Boolean : Boolean.cs
using System;
class Booleans
{
public static void Main()
{
bool content = true;
bool noContent = false;
Console.WriteLine("It is {0} that C# Station provides C# programming language content."، content);
Console.WriteLine("The statement above is not {0}."، noContent);
}
}
در این مثال مقدارهای Boolean به عنوان جزئی از یک جمله برای کنسول نوشته شده اند.تنها مقدارهای معتبر در boo ،true و false هستند ، همان طور که در listing 1-2، true جایگزین content و false جایگزین nocontent شده است. هنگامی که برنامه را اجرا کنید،برنامه خروجی زیر را به دست می دهد.
It is True that C# Station provides C# programming language content.
The statement above is not False.
در C#، Integral خود یک طبقه از نوع ها را تشکیل می دهد. واژه ی integral همچنین یک واژه ی ریاضی است و به همین دلیل خیلی ها را گمراه می کند. ولی integral در تعریف خصوصیات زبان برنامه نویسی C# به نوع ها (Types) ی اَنتگرال اشاره دارد. از نوع اعداد صحیح علامت گذاری شده یا علامت گذاری نشده وهمچنین char هستند. نوع char همان گونه که توسط استاندارد Unicode تعریف شده، باید یک کاراکتر Unicode باشد.جدول 2-1 گستره، اندازه و نوع اَنتگرال را به نمایش می گذارد.
جدول 2-1.اندازه و گستره ی نوع اَنتگرال C#
|
Type(نوع) |
Size(اندازه به واحد bit) |
Range(گستره) |
|
sbyte |
8 |
-128 to 127 |
|
byte |
8 |
0 to 255 |
|
short |
16 |
-32768 to 32767 |
|
ushort |
16 |
0 to 65535 |
|
int |
32 |
-2147483648 to 2147483647 |
|
unit |
32 |
0 to 4294967295 |
|
long |
64 |
-9223372036854775808 to 9223372036854775807 |
|
ulong |
64 |
0 to 18446744073709551615 |
|
char |
16 |
0 to 65535 |
نوع های انتگرال برای آن دسته عملیاتی که درآن محاسبات اعداد صحیح انجام می شود بسیار مناسب اند. نوع char به این خاطر که نشانگر تنها یک کاراکتر Unicode است، استثنا محسوب می شود. همان طور که در جدول بالا مشاهده می کنید، گزینه های مختلفی وجود دارد که شما بسته به نیازتان می توانید از آن ها استفاده کنید.
نوع های Decimal (اعشاری) و floating point (ممیز شناور)
نوع floating point زبان برنامه نویسی C# می تواند یکی از دو نوع شناور یا دابل باشد. براساس دستور IEEE 754، هنگامی می توانید از نوع های مذکور استفاده کنید که بخواهید عددی واقعی نشان دهید. از نوع Decimal برای نشان دادن مقدارهای مالی و پولی استفاده می شود.جدول 2-2 نوع، اندازه، گستره و دقت floating point و Decimal را به نمایش می گذارد.
جدول 2-2. نوع های floating point و Decimal با نوع، اندازه، گستره و دقت آن ها
|
Type(نوع) |
Size(اندازه به واحد bit) |
Precision(دقت) |
Range(گستره) |
|
Float(شناور) |
32 |
7 رقمه (digits) |
1.5 x 10-45 to 3.4 x 1038 |
|
double |
64 |
15-16 رقمه |
5.0 x 10-324 to 1.7 x 10308 |
|
decimal |
128 |
28-29 محل اعشاری (decimal places) |
1.0 x 10-28 to 7.9 x 1028 |
زمانی که باید عملیاتی انجام دهیم که لازمه ی نمایش کسری (fractional representation) هست، از ممیز شناور (floating point) بهره می گیریم. اما، نوع decimal (اعشاری) به دلیل اینکه هنگام گرد (round) کردن به خطا یا error برنمی خورد، برای انجام محاسبات مالی بهترین گزینه است.
نوع رشته ای (string type)
رشته در واقع یک دنباله ی متوالی از کاراکترهای متنی هست. معمولاً برای به وجود آوردن یک رشته، خود لفظ رشته (string litral) را داخل علامت نقل و قول قرار می دهیم : "This is an example of a string.".
برخی کاراکترها را نمی توان پرینت کرد ولی در هر حال مجبور از آن ها در رشته استفاده کنیم.به همین دلیل،C# دستور نحوی خاصی دارد که در آن می توان برای نمایش کاراکترهای پیرینت نشدنی از کاراکترها عادی گریخت (escape). برای مثال، استفاده از خط جدید (newline) در متن که با علامت '\n' char نمایش داده می شود بسیار معمول است.علامت، '\'، گریز (escape) را نشان می دهد.هنگامی که کاراکتر گریز (Esc) پیش از 'n' قرارگیرد، 'n'دیگر یک کاراکتر الفبا تفسیر نمی شود، بلکه نشان گر یک خط جدید است. برای نشان دادن کاراکتر backslashدر کُدتان باید با استفاده از '\\' از آن هم فرار کنید. جدول 2-2 ترتیب escape یا گریز را برای شما به نمایش می گذارد.
|
Escape sequence |
meaning |
|
\' |
Single quote |
|
\" |
Double quote |
|
\\ |
Backslash |
|
\0 |
Null(تهی)،با مقدار null یکی نیست. |
|
\a |
Bell |
|
\b |
Backspace |
|
\f |
)Form feedتغزییه ی فرم) |
|
\n |
Newline(خط جدید) |
|
\r |
Carriage return(بازگشت به اول خط) |
|
\t |
Horizontal tab(تب های افقی) |
|
\v |
Vertical tab (تَب های عمودی) |
ویژگی مفید دیگر رشته های C# لفظ واژه به واژه (literal verbatim) آن است، که رشته ای است با @ symbol prefix مانند @"Some string". literal verbatimبرای تسهیل و بهبود خوانایی،escape sequence را مجبور می کند تا ترجمه را در قالب کاراکترهای عادی انجام دهد.برای درک بهتر مفهوم و مقدار verbatim literal، دستور مسیری (path statement) مثل c:\\topdir\\subdir\\subdir\\myapp.exe" را در نظر بگیرید. همان طور که در این مثال مشاهده می کنید backslash ها گریخته اند (escape) که این باعث شده خوانایی رشته کاهش یابد. شما می توانید به راحتی با استفاده از verbatim literalرشته را به این صورت بهبود ببخشید.
@"c:\topdir\subdir\subdir\myapp.exe".
این مسئله رفع شد ولی اکنون شما با مشکل نقل و قول متن مواجه می شوید که به این آسانی حل نمی شود.چنانچه به همچین مشکلی برخوردید باید دوتا علامت نقل وقول " " را برای این کار معرفی کنید.برای مثال، رشته ی "copy \"c:\\source file name with spaces.txt\" c:\\newfilename.txt" با verbatim literal به این صورت نوشته می شود : @"copy ""c:\source file name with spaces.txt"" c:\newfilename.txt".
عملگرهای C#
نتایج با ساختن عبارت ها (expression) محاسبه می شوند. ساخت این عبارت ها با ترکیب متغیرها و عملگرها با هم وقرار دادن آن ها در دستورهای واحد صورت می پذیرد. جدول زیر عملگرهای معتبر را به همراه تقدم و شرکت پذیری آن ها به نمایش می گذارد.
|
((categoryطبقه بر اساس الوییت و تقدم |
Operators(عملگرها) |
Associativity(شرکت پذیری) |
|
primary |
x.y f(x) a[x] x++ x-- new typeof default checked unchecked delegate |
left |
|
Unary(یگانی) |
+ - ! ~ ++x --x (T)x |
right |
|
Multiplicative(افزاینده) |
* / % |
left |
|
Additive(جمع پذیر) |
+ - |
left |
|
Shift(جا به جایی) |
<< >> |
left |
|
Relational(رابطه ای) |
< > <= >= is as |
left |
|
Equality(برابری) |
== != |
right |
|
Logical AND(منطقی) |
& |
left |
|
Logical XOR |
^ |
left |
|
Logical or |
| |
left |
|
Conditional and(شرطی) |
&& |
left |
|
Conditional or |
|| |
left |
|
Null coalescing |
?? |
left |
|
Ternary(بر مبنای سه) |
?: |
right |
|
Assignment(جایگزینی) |
= *= /= %= += -= <<= >>= &= ^= |= => |
right |
Left associativity (شرکت پذیری چپ) عملیات را از چپ به راست ارزشیابی می کند.right associativity یعنی که عملیات همه از سمت راست به چپ به راست اتفاق می افتد، همانند عملگرهای جایگزین (assignment operators) که در آن هر چیزی که در سمت راست قرار دارد پیش از این که نتیجه در متغیر سمت چپ قرار داده شود ارزیابی می شود.
بیشتر عملگرها از دوحالت یگانی (unary) و دو تایی (binary) خارج نیستند. unary operator ها عبارت ها را در داخل تنها یک متغیر شکل می دهند، در حالی که binary operator ها با دو متغیر عبارت ها را تشکیل می دهند.
Listing 2-2 نحوه ی به کارگیری عملگرهای یگانی را نمایش می دهد.
Listing 2-2. عملگرهای یگانی : Unary.cs
using System; class Unary { public static void Main() { int unary = 0; int preIncrement; int preDecrement; int postIncrement; int postDecrement; int positive; int negative; sbyte bitNot; bool logNot; preIncrement = ++unary; Console.WriteLine("pre-Increment: {0}"، preIncrement);
preDecrement = --unary; Console.WriteLine("pre-Decrement: {0}"، preDecrement); postDecrement = unary--; Console.WriteLine("Post-Decrement: {0}"، postDecrement); postIncrement = unary++; Console.WriteLine("Post-Increment: {0}"، postIncrement); Console.WriteLine("Final Value of Unary: {0}"، unary); positive = -postIncrement; Console.WriteLine("Positive: {0}"، positive); negative = +postIncrement; Console.WriteLine("Negative: {0}"، negative); bitNot = 0; bitNot = (sbyte)(~bitNot); Console.WriteLine("Bitwise Not: {0}"، bitNot); logNot = false; logNot = !logNot; Console.WriteLine("Logical Not: {0}"، logNot); } }
هنگام ارزیابی عبارت ها، توجه داشته باشید که عملگرهای post-increment (x++)و post-decrement (x--) ابتدا مقدار جاری را بازمی گرداند و سپس عملگرها را اعمال می کنند. در حالی که اگر از عملگرهای pre-increment (++x) و pre-decrement (--x) استفاده کنید متوجه می شوید که ابتدا عملگر برای متغیر اعمال می شود و سپس مقدار نهایی برگردانده می شود.
در listing 2-2، متغیر unary صفر مقدار دهی می شود. هنگامی که از عملگر pre-increment (++x) استفاده می شود،unary به مقدار 1 افزوده (increment) می شود و مقدار 1 به متغیر preIncrement (اختصاص) داده می شود.
عملگر pre-decrement (--x)،unary را به صفر برمی گرداند و سپس مقدار را به متغیر preIncrement می دهد.
هنگامی که عملگر post-decrement (x--) به کار می رود، مقدار unary، 0، داخل متغیر postDecrement قرار داده می شود، سپس unary به مقدار 1- کاهش (decrement) داده می شود. سپس عملگر post-increment (x++)، مقدار جاری unary، 1-، را به متغیر postIncrement انتقال می دهد و بعد unary را به 0 افزایش می دهد.
متغیر bitNot به 0 مقدار دهی می شود و بعد عملگر bitwise not (~) اعمال می گردد. عملگر bitwise not (~)، bit ها را در متغیر وارونه (flip) می کند. در این مثال، نمایش دو گانه ی 0،"00000000" ، به 1-، "11111111" تبدیل می شود.
با اینکه عملگر (~)، bit ها را وارونه می کند،عملگر خنثی سازی منطقی (!) با مقدارهای bool کار می کند، true را به false یا false را به true تغییر می دهد. در مورد متغیر logNot در listing 2-2، value به false مقدار دهی می شود و خط بعدی عملگر خنثی سازی منطقی (!) را اعمال می کند که در نتیجه true بازمی گرداند و مقدار جدید، true را دوباره به logNot اختصاص می دهد. در واقع، مقدار متغیر bool، logNotرا toggle می کند.
انتخاب positive کمی دشوار است. زمانی که انتخاب (set) می شود، متغیر postIncrement برابر 1- است. به کار گیری عملگر منفی (-) برای یک عدد منفی ،یک عدد مثبت می سازد، به این معنا که مثبت به جای 1- ، برابر 1 خواهد بود. عملگر منفی (-) که با عملگر pre-decrement (--)، هیچ ارتباطی ندارد، مقدار postInc – را تغییر نمی دهد، بلکه فقط علامت خنثی سازی (negation) را اعمال می کند. عملگر مثبت (+) هیچ تاثیری بر روی مقدار یک عدد ندارد.
به عبارت (sbyte)(~bitNot) توجه کنید. هر گونه عملیاتی که روی نوع های (sbyte)(~bitNot) یا ushort انجام شود، مقدار int بازمی گرداند. برای این که نتیجه را در مقدار bitNot قرار دهیم، می بایست از تبدیل نوع (cast)، (Type)استفاده می کردیم، یا هرجای دیگری که Type در واقع همان نوعی است که قصد دارید چیزی را به آن تبدیل کنید(که در این مورد همان sbyte منظور است). در جدول 4-2 عملگر تبدیل نوع (cast) به صورت عملگر یگانی (T)xنشان داده شده. عملگرهای تبدیل نوع، باید هنگامی که چیزی را از نوع های بزرگتر به نوع های کوچکتر تبدیل می کنید،به صورت صریح (explicit) انجام شوند زیرا که احتمال گم شدن اطلاعات در هنگام انجام عملیات وجود دارد. عموماً، اختصاص دادن یک نوع کوچکتر به بزرگتر بسیار آسان است و مشکلی به وجود نمی آورد، زیرا نوع بزرگ جا به اندازه ی کافی برای دربرگرفتن تمام مقدار را دارد.همچنین باید از خطرات casting بین نوع های علامت گذاری شده و نشده آگاه باشید. شما باید تحت هر شرایطی تمامیت اطلاعات خود را حفظ کنید.
خروجی listing2-2 به شرح زیر است.
pre-Increment: 1
pre-Decrement 0
Post-Decrement: 0
Post-Increment: -1
Final Value of Unary: 0
Positive: 1
Negative: -1
Bitwise Not: -1
Logical Not: true
علاوه بر عملگرهای یگانی،C# همچنین عملگرهای دوگانی دارد که متغیرهایی متشکل از دو عبارت می سازد.Listing2-3 نحوه ی استفاده از این عملگرها را نشان می دهد.
Listing2-3:عملگرهای دوگانی : Binary.cs
using System;
class Binary
{
public static void Main()
{
int x، y، result;
float floatresult;
x = 7;
y = 5;
result = x+y;
Console.WriteLine("x+y: {0}"، result);
result = x-y;
Console.WriteLine("x-y: {0}"، result);
result = x*y;
Console.WriteLine("x*y: {0}"، result);
result = x/y;
Console.WriteLine("x/y: {0}"، result);
floatresult = (float)x/(float)y;
Console.WriteLine("x/y: {0}"، floatresult);
result = x%y;
Console.WriteLine("x%y: {0}"، result);
result += x;
Console.WriteLine("result+=x: {0}"، result);
}
}
And here's the output:
x+y: 12
x-y: 2
)x*y: 35
x/y: 1
x/y: 1.4
x%y: 2
result+=x: 9
listing2-3 نمونه های زیادی از عملگرهای دوگانی را نشان می دهد. همان جوری که انتظار می رفت، اضافه (+)، تفریق (-)، تقسیم (/) و ضرب (*) نتایج ریاضی مورد نظر را تولید می کنند.
متغیر floatresult از نوع ممیز اعشاری (floating point) می باشد. برای محاسبه مقدار floating point، باید متغیرهای عدد صحیح (integer variable) x و y را صریحاً تبدیل نوع (cast) کنیم.
نمونه ای از عملگر باقی مانده (%) نیز آورده شده. عملیات تقسیم را روی دو مقدار انجام می دهد و بعد باقی مانده را باز می گرداند.دستور آخر نیز نوع دیگری از عملیات جایگزینی را با عملگرهای (+=) نمایش می دهد.هر گاه که جایگزینی (assignment) با عملگر عملیات (operation operator) انجام می شود، دقیقاً مثل اعمال عملگرهای دوگانی برای هر دو سمت راست و چپ عملگر و قرار دادن نتیجه درهر دو سمت چپ و راست آن می باشد. مثال این گونه نیز می توانست نوشته شود : result = result + x; ولی همان نتیجه (مقدار) به دست می آمد.
نوع آرایه ای
نوع دیگر اطلاعات که باید به آن اشاره کنیم نوع آرایه است. می توان درباره ی آن به عنوان یک مخزن دربردارنده ی فهرستی از مکان های ذخیره سازی مختص نوع خاصی از اطلاعات استفاده کرد. هنگام معرفی یک آرایه، باید اندازه، نوع، ابعاد و اسم آن را نیز مشخص کنید.
Listing 2-4 :عملگرهای آرایه. Array.cs
using System; class Array {
public static void Main() { int[] myInts = { 5، 10، 15 }; bool[][] myBools = new bool[2][]; myBools[0] = new bool[2]; myBools[1] = new bool[1]; double[،] myDoubles = new double[2، 2]; string[] myStrings = new string[3]; Console.WriteLine("myInts[0]: {0}، myInts[1]: {1}، myInts[2]: {2}"، myInts[0]، myInts[1]، myInts[2]);
myBools[0][0] = true; myBools[0][1] = false; myBools[1][0] = true; Console.WriteLine("myBools[0][0]: {0}، myBools[1][0]: {1}"، myBools[0][0]، myBools[1][0]);
myDoubles[0، 0] = 3.147; myDoubles[0، 1] = 7.157; myDoubles[1، 1] = 2.117; myDoubles[1، 0] = 56.00138917; Console.WriteLine("myDoubles[0، 0]: {0}، myDoubles[1، 0]: {1}"، myDoubles[0، 0]، myDoubles[1، 0]);
myStrings[0] = "Joe"; myStrings[1] = "Matt"; myStrings[2] = "Robert"; Console.WriteLine("myStrings[0]: {0}، myStrings[1]: {1}، myStrings[2]: {2}"، myStrings[0]، myStrings[1]، myStrings[2]);
} } And here's the output: myInts[0]: 5، myInts[1]: 10، myInts[2]: 15 myBools[0][0]: true، myBools[1][0]: true myDoubles[0، 0]: 3.147، myDoubles[1، 0]: 56.00138917 myStrings[0]: Joe، myStrings[1]: Matt، myStrings[2]: Robert
Listing 2-4 پیاده سازی های مختلف آرایه را نشان می دهد.اولین نمونه myInts است که آرایه ای تک بعدی می باشد.در زمان معرفی و با مقدارهای صریح (explicit value) مقدار دهی می شود.
آرایه ی بعدی (myBools) از نوع jagged می باشد. در واقع یک آرایه ای متشکل از آرایه های دیگر است. برای نمونه سازی اندازه آرایه ی اصلی باید از عملگر new (primary array) استفاده می کردیم و سپس عملگر new را دوباره برای هر زیر-آرایه (subarray) به کار می بردیم.
نمونه ی دوم آرایه ای دوبعدی (myDoubles) است.آرایه ها می توانند چند بعدی هم باشند که هر بعد به کمک comma از بعد دیگر جدا می شود. همچنین باید برای نمونه سازی آن ها از عملگر new استفاده کرد.
یکی از تفاوت های بین آرایه ی jagged (myBools[][]) و آرایه ی چند بعدی ] myDoubles[، این است که آرایه ی چند بعدی برای تمام عنصرهای هر بعد حافظه ی اختصاصی کنار میگذارد،در حالی که آرایه ی jagged تنها برای اندازه ی هر آرایه در هر بعدی که شما تعریف می کنید حافظه اختصاص می دهد. بیشتر مواقع نیاز شما با به کار گیری آرایه چند بعدی رفع می گردد و آرایه ی jagged تنها در موارد خاص که شما می توانید با مشخص کردن اندازه ی آرایه ها در هر بعد به صورت صریح (explicit) حافظه ی قابل توجه ای صرفه جویی و حفظ کنید مورد استفاده قرار می گیرد.
سرانجام تنها یک نوع آرایه باقی می ماند و آن آرایه ی تک بعدی (myStrings) است.
همان طور که مشاهده می کنید، برای دسترسی به هر آرایه باید اَندیس عدد صحیح (integer index) مختص آن آیتم را مشخص کنید. اندازه آرایه ها ممکن است هر مقدار نوع (type value) int باشد.
چکیده
متغیر شناسه ای است با نوع که مقدار آن نوع را دربردارد.نوع های ساده شامل integrals floating points، decimal و bool می شود. C# عملگرهای منطقی و ریاضی زیادی دارد که در ساخت عبارت ها نقش اساسی ایفا می کنند. C#همچنین آرایه های تک بعدی، چند بعدی و jagged را در اختیار کاربر قرار می دهد.